# utils是写公共的代码，excepts是写异常处理的代码，我们将所有有可能出现的问题都写入到excepts中
from rest_framework.views import exception_handler
from rest_framework_simplejwt.exceptions import InvalidToken,TokenError,AuthenticationFailed
from rest_framework.response import Response

# 现在要开始分析添加课程会出现的一些异常：
# 1.因为添加课程是需要进行登录的，有可能会返回未登陆异常：在postman中测试接口会返回401错误
# 解决方案是直接在视图中进行捕获异常，有特殊的验证方法：1.permission 2.request.user.is_authenticated
# 只需要在前端提示用户要进行登录，跳转到登录页面即可

# 2.也同样是401的异常，但是可能是token过期了，需要重新登录获取token
# 这里我们处理token过期的异常
# 如果国企我们将错误信息返回给前端-->前端提示用户后自动调取刷新接口，并使用老token取换新的token
# 并将新的token保存在local或session中去，以便下次请求时使用


def custom_exception_handler(exc,context):

    # 先调用DRF中的方法，获取默认的错误信息
    response = exception_handler(exc,context)

    # 接着进行判断:response是一个对象，对象时使用None的，如果是正常的字段使用not
    if response is None:  # 如果没有错误信息，我们正常返回响应
        return response

    # 过期异常可能会触发这三种(InvalidToken,TokenError,AuthenticationFailed)
    if isinstance(exc,(InvalidToken,TokenError,AuthenticationFailed)):
        # isinstance是判断实例异常类型 是否是指定的异常类型
        return Response({
            'code':401,
            'message':'token已过期'
        })


    # 剩下其他的异常，我们暂时不处理，直接返回默认的错误信息
    return Response({
        'code':0,
        'message':str(exc)
    })


# 然后你这里写了异常处理，但系统是看不到的，需要在dev-->rest_framework进行配置，这是自定义处理器
